// smrs_config.h
#ifndef SMRS_CONFIG_H
#define SMRS_CONFIG_H

#include "xil_types.h" // For u32, u64, etc.
#include "xparameters.h" // For XPAR_GPU_RENDER_TBR_0_BASEADDR
#include "vdma_display.h" // For VDMA_FRAME_BUFFER_BASE_ADDR, VDMA_SINGLE_FRAME_SIZE, VDMA_NUM_FRAME_BUFFERS

// --- GPU_Render_TBR IP 配置 ---
#define SMRS_GPU_RENDER_TBR_BASE_ADDR    XPAR_GPU_RENDER_TBR_0_BASEADDR // HLS IP 的 AXI-Lite 控制接口地址

// HLS IP 常量 (需要确保这些与 HLS IP 设计完全匹配)
#define SMRS_MAX_NUM_TRIANGLES           1023    // from gpu_render.hpp (ap_uint<10> for triangle ID max 1023)
#define SMRS_NUM_AXI_WORDS_PER_PACKET    23      // 每个三角形数据包的 64 位字数

// HLS IP 内部的 DDR 字宽类型
typedef u64 smrs_ddr_word_t; // 对应 ap_uint<64>

// --- GPU IP 使用的 DDR 缓冲区地址 ---
// 参数缓冲区：紧接在所有 HLS 和 VDMA 帧缓冲区之后
#define SMRS_GPU_PARAMS_BUFFER_BASE_ADDR (VDMA_FRAME_BUFFER_BASE_ADDR + ((UINTPTR)VDMA_SINGLE_FRAME_SIZE * VDMA_NUM_FRAME_BUFFERS))

// 定义一个辅助函数进行向上对齐
#define SMRS_ALIGN_UP(addr, align_bytes) (((addr) + (align_bytes) - 1) & ~((align_bytes) - 1))

// ZBuffer：紧接在参数缓冲区之后，并考虑 128 字节对齐
// ZBuffer 是 u16 类型的，大小为 HLS_RENDER_WIDTH * HLS_RENDER_HEIGHT * 2 字节。
// 这里的 HLS_RENDER_WIDTH 和 HLS_RENDER_HEIGHT 实际值将由 VdmaDisplay 模块提供，
// SMRS_GPU_PARAMS_TOTAL_BYTE_SIZE 只是一个预估值，用于计算 ZBuffer 的基地址。
// 实际 ZBuffer 大小在运行时根据 VdmaDisplay 的配置确定。
// SMRS_GPU_PARAMS_TOTAL_BYTE_SIZE 应该足够大，以容纳应用程序可能提供的所有三角形数据。
// 例如，如果应用提供 1024 个三角形，每个 23 个字，则为 1024 * 23 * 8 字节。
#define SMRS_MAX_MODEL_TRIANGLES_SUPPORTED 2048 // 假设最多支持的模型三角形数量，用于预估DDR大小
#define SMRS_GPU_PARAMS_TOTAL_BYTE_SIZE (SMRS_MAX_MODEL_TRIANGLES_SUPPORTED * SMRS_NUM_AXI_WORDS_PER_PACKET * sizeof(smrs_ddr_word_t))

#define SMRS_GPU_ZBUFFER_BASE_ADDR SMRS_ALIGN_UP(SMRS_GPU_PARAMS_BUFFER_BASE_ADDR + SMRS_GPU_PARAMS_TOTAL_BYTE_SIZE, 128)

#endif // SMRS_CONFIG_H

